/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package paquetevistas.almacen;

import controlador.almacen.controladoralmacen;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import java.util.ArrayList;
import java.util.List;

import jxl.*;//Por el Excel 
import java.io.*;//Por el Excel 
import java.io.File;
import java.util.Date;
import modelos.Producto;
import modelos.Usuario;
import Seguridad.Controlador.controladorseguridad;
import modelos.Actividad;
import modelos.ProductoxrecetaId;
import modelos.Receta;

/**
 *
 * @author mariofcandia
 */
public class CargaMasivaProducto extends javax.swing.JInternalFrame {

    /**
     * Creates new form CargaMasivaProducto
     */
    public static Usuario usuario = lbj.LBJ.Login.usuario;
    public static controladorseguridad mycontroladorseguridad = new controladorseguridad();
    public static controladoralmacen mycontroladoralmacen = new controladoralmacen();

    public CargaMasivaProducto() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        txtNombreArchivo = new javax.swing.JTextField();
        btnCargar = new javax.swing.JButton();
        btnBuscar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();

        setClosable(true);
        setIconifiable(true);
        setTitle("Carga Masiva de Productos");

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Seleccione Archivo"));

        txtNombreArchivo.setEditable(false);

        btnCargar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/save.png"))); // NOI18N
        btnCargar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCargarActionPerformed(evt);
            }
        });

        btnBuscar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/search.png"))); // NOI18N
        btnBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnBuscarActionPerformed(evt);
            }
        });

        jLabel1.setText("Archivo:");

        jLabel2.setText("Buscar");

        jLabel3.setText("Cargar");

        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(jLabel1)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(txtNombreArchivo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 144, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(btnBuscar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 46, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(jLabel2))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(btnCargar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 46, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(6, 6, 6)
                        .add(jLabel3)))
                .add(0, 16, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(14, 14, 14)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(btnCargar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 46, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(btnBuscar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 46, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(jLabel2)
                            .add(jLabel3)))
                    .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                        .add(txtNombreArchivo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .add(jLabel1)))
                .addContainerGap(14, Short.MAX_VALUE))
        );

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(15, 15, 15)
                .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(19, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(15, 15, 15)
                .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(33, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBuscarActionPerformed
        // TODO add your handling code here:
        JFileChooser file = new JFileChooser();
        int opcion = file.showOpenDialog(this);
        if (opcion == JFileChooser.APPROVE_OPTION) {
            this.txtNombreArchivo.setText(file.getSelectedFile().getPath());
        }
    }//GEN-LAST:event_btnBuscarActionPerformed

    private void btnCargarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCargarActionPerformed
        // TODO add your handling code here:
        //INICIO: Lee desde Archivo excel
        if ("".equals(txtNombreArchivo.getText())) {
            JOptionPane.showMessageDialog(this, "Ruta de archivo no especificada.");
            return;
        }
        if (JOptionPane.showConfirmDialog(this,
                "¿Está seguro de agregar los Productos desde " + txtNombreArchivo.getText() + "?", "Carga Masiva de Productos", JOptionPane.YES_NO_OPTION) == JOptionPane.OK_OPTION) {
            int fila = 0;
            int col = 0;
            try {
                Workbook archivoExcel = Workbook.getWorkbook(new File(txtNombreArchivo.getText()));

                Sheet hoja = archivoExcel.getSheet(0);
                int numColumnas = hoja.getColumns();
                int numFilas = hoja.getRows();

                List<modelos.Producto> productos = new ArrayList<modelos.Producto>();
                List<modelos.Producto> productosexistentes = new ArrayList<modelos.Producto>();
                List<Date> fechas = new ArrayList<Date>();
                int existencia;

                for (fila = 1; fila < numFilas; fila++) { // Recorre cada fila de la hoja    
                    existencia = 0;
                    col = 0;
                    modelos.Producto producto = new modelos.Producto();
                    String nombre, descripcion;
                    float stock, stockminimo, stockmaximo;
                    String tipo, alm, uni, stocks;
                    String peso = null, costo = null;//¿? Están como tipo de dato STRING en la base de datos
                    DateCell dcfecha;
                    Date fecha;

                    nombre = hoja.getCell(col++, fila).getContents();
                    descripcion = hoja.getCell(col++, fila).getContents();
                    stocks = hoja.getCell(col++, fila).getContents();
                    stock = Float.parseFloat(stocks.replace(",", "."));
                    stockminimo = Float.valueOf(hoja.getCell(col++, fila).getContents());
                    stockmaximo = Float.valueOf(hoja.getCell(col++, fila).getContents());
                    tipo = hoja.getCell(col++, fila).getContents();
                    alm = hoja.getCell(col++, fila).getContents();
                    uni = hoja.getCell(col++, fila).getContents();
                    if (tipo.equalsIgnoreCase("Materia Prima") || tipo.equalsIgnoreCase("Insumo")) {
                        col++;
                        col++;
                    } else if (tipo.equalsIgnoreCase("Producto Intermedio")) {
                        col++;
                        costo = hoja.getCell(col++, fila).getContents().toString();
                    } else {
                        peso = hoja.getCell(col++, fila).getContents();
                        costo = hoja.getCell(col++, fila).getContents().toString();
                    }
                    dcfecha = (DateCell) hoja.getCell(col++, fila);
                    fecha = dcfecha.getDate();

                    modelos.Tipoproducto tipoproducto = mycontroladoralmacen.sacatipoproductobynombre(tipo);
                    modelos.Almacen almacen = mycontroladoralmacen.getalmacenbyname(alm);
                    modelos.Unidadmedida unidad = mycontroladoralmacen.sacaidunidad(uni);

                    producto.setNombre(nombre);
                    producto.setDescripcion(descripcion);
                    producto.setStock(stock);
                    producto.setStockminimo(stockminimo);
                    producto.setStockmaximo(stockmaximo);
                    producto.setEstado(1);
                    producto.setTipoproducto(tipoproducto);
                    producto.setAlmacen(almacen);
                    producto.setUnidadmedida(unidad);
                    //cambie esto
                    if (tipo.equalsIgnoreCase("Materia Prima") || tipo.equalsIgnoreCase("Insumo")) {
                        producto.setCosto(null);
                        producto.setPeso(null);
                    } else if (tipo.equalsIgnoreCase("Producto Intermedio")) {
                        producto.setCosto(Float.parseFloat(costo.replace(",", ".")));
                        producto.setPeso(null);
                    } else {
                        producto.setCosto(Float.parseFloat(costo.replace(",", ".")));
                        producto.setPeso(Float.parseFloat(peso.replace(",", ".")));
                    }
                    existencia = mycontroladoralmacen.verificaexistenciaproducto(nombre);
                    if (existencia == 1) {
                        productosexistentes.add(producto);
                    } else {
                        productos.add(producto);
                    }
                    fechas.add(fecha);
                }
                if (productos.size() > 0 && productosexistentes.size() == 0) {
                    mycontroladoralmacen.guardaListaProductos(productos, fechas);

                    fila = 0;
                    col = 0;

                    hoja = archivoExcel.getSheet(1);
                    numColumnas = hoja.getColumns();
                    numFilas = hoja.getRows();
                    int idreceta = 0;
                    Float cantidad2r;
                    String nombre2, cantidad2;
                    String nombre = null, actividad;

                    for (fila = 2; fila < numFilas; fila++) {
                        col = 0;
                        if (!((hoja.getCell(col, fila).getContents().toString()).isEmpty())) {
                            //lee el nombre, la actividad y guarda la receta
                            nombre = hoja.getCell(col++, fila).getContents();
                            actividad = hoja.getCell(col++, fila).getContents();
                            System.out.println(nombre + " " + actividad);
                            Actividad act = new Actividad();
                            act = mycontroladoralmacen.sacaactividadbyname(actividad);
                            System.out.println(nombre + " " + act.getNombre());
                            idreceta = mycontroladoralmacen.guardarecetasacasuid(nombre, act);
                        } else {
                            col++;
                            col++;
                        }
                        Receta receta = mycontroladoralmacen.sacarecetabyidreceta(idreceta);
                        nombre2 = hoja.getCell(col++, fila).getContents();
                        Producto p2 = mycontroladoralmacen.sacaproductobynombre(nombre2);
                        cantidad2 = hoja.getCell(col++, fila).getContents().toString();
                        cantidad2r = Float.parseFloat(cantidad2.replace(",", "."));
                        ProductoxrecetaId pxr = new ProductoxrecetaId();
                        pxr.setIdreceta(idreceta);
                        pxr.setIdproducto(p2.getIdproducto());
                        mycontroladoralmacen.guardaproductoxreceta(pxr, receta, p2, cantidad2r);
                    }
                    JOptionPane.showMessageDialog(this, "Se agregaron los productos exitosamente.");
                    lbj.LBJ.Login.escritorio.producto.refreshProductTable();
                    this.dispose();
                } else if (productos.size() == 0 && productosexistentes.size() > 0) {
                    JOptionPane.showMessageDialog(this, "Los productos que intenta guardar ya existen.");
                    this.dispose();
                } else if (productos.size() > 0 && productosexistentes.size() > 0) {
                    mycontroladoralmacen.guardaListaProductos(productos, fechas);
                    fila = 0;
                    col = 0;

                    hoja = archivoExcel.getSheet(1);
                    numColumnas = hoja.getColumns();
                    numFilas = hoja.getRows();
                    int idreceta = 0;
                    Float cantidad2r;
                    String nombre2, cantidad2;
                    String nombre = null, actividad;

                    for (fila = 2; fila < numFilas; fila++) {
                        col = 0;
                        if (!((hoja.getCell(col, fila).getContents().toString()).isEmpty())) {
                            //lee el nombre, la actividad y guarda la receta
                            nombre = hoja.getCell(col++, fila).getContents();
                            actividad = hoja.getCell(col++, fila).getContents();
                            System.out.println(nombre + " " + actividad);
                            Actividad act = new Actividad();
                            act = mycontroladoralmacen.sacaactividadbyname(actividad);
                            System.out.println(nombre + " " + act.getNombre());
                            idreceta = mycontroladoralmacen.guardarecetasacasuid(nombre, act);
                        } else {
                            col++;
                            col++;
                        }
                        Receta receta = mycontroladoralmacen.sacarecetabyidreceta(idreceta);
                        nombre2 = hoja.getCell(col++, fila).getContents();
                        Producto p2 = mycontroladoralmacen.sacaproductobynombre(nombre2);
                        cantidad2 = hoja.getCell(col++, fila).getContents().toString();
                        cantidad2r = Float.parseFloat(cantidad2.replace(",", "."));
                        ProductoxrecetaId pxr = new ProductoxrecetaId();
                        pxr.setIdreceta(idreceta);
                        pxr.setIdproducto(p2.getIdproducto());
                        mycontroladoralmacen.guardaproductoxreceta(pxr, receta, p2, cantidad2r);
                    }
                    
                    JOptionPane.showMessageDialog(this, "Se agregaron los productos nuevos exitosamente. Algunos ya existian");
                    lbj.LBJ.Login.escritorio.producto.refreshProductTable();
                    this.dispose();
                } else if (productos.size() == 0 && productosexistentes.size() > 0) {
                    JOptionPane.showMessageDialog(this, "El archivo que intenta cargar esta vacio.");
                    this.dispose();
                }

                //INICIO: Inserto acción en el Log
//                mycontroladorseguridad.insertarlog(usuario, new Date(), "Insertar", "Producto", "Registrar Producto");
//                mycontroladorseguridad.insertarlog(usuario, new Date(), "Insertar", "Movimiento", "Registrar Movimiento");
//                mycontroladorseguridad.insertarlog(usuario, new Date(), "Insertar", "Productoxmovimiento", "Registrar Productoxmovimiento");
                //FIN: Inserto acción en el Log

                //            } 
            } catch (Exception ioe) {
                ioe.printStackTrace();
                JOptionPane.showMessageDialog(null, "Error: En el Archivo, en la Fila " + (fila + 1) + " y Columna " + col);
            }
        }
        //FIN: Lee desde Archivo excel
    }//GEN-LAST:event_btnCargarActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnBuscar;
    private javax.swing.JButton btnCargar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JTextField txtNombreArchivo;
    // End of variables declaration//GEN-END:variables
}
